<?php

// ------------------------------------------------------------------------
// |@Author       : Jarmin <topextend@qq.com>
// |@----------------------------------------------------------------------
// |@Date         : 2025-05-09 18:51:33
// |@----------------------------------------------------------------------
// |@LastEditTime : 2025-05-17 18:55:26
// |@----------------------------------------------------------------------
// |@LastEditors  : Jarmin <topextend@qq.com>
// |@----------------------------------------------------------------------
// |@Description  :
// |@----------------------------------------------------------------------
// |@FilePath     : SystemConfig.php
// |@----------------------------------------------------------------------
// |@Copyright (c) 2025 http://www.ladmin.cn All Rights Reserved.
// ------------------------------------------------------------------------
declare (strict_types=1);

namespace think\admin\model;

use think\admin\Model;
use think\model\relation\BelongsTo;

/**
 * 系统配置模型
 * Class SystemConfig
 * @package think\admin\model
 */
class SystemConfig extends Model
{
    // 设置字段信息
    protected $schema = [
        'id'          => 'int',
        'site_id'     => 'int',
        'group_id'    => 'int',
        'name'        => 'string',
        'code'        => 'string',
        'value'       => 'string',
        'type'        => 'string',
        'options'     => 'string',
        'sort'        => 'int',
        'remark'      => 'string',
    ];

    /**
     * 关联配置组
     * @return BelongsTo
     */
    public function group(): BelongsTo
    {
        return $this->belongsTo(SystemConfigGroup::class, 'group_id', 'id');
    }
    /**
     * 获取器：根据类型处理原始配置值 (value 字段)
     * 当类型为 'switch' 时，将 "0" 转换为 false, "1" 转换为 true。
     *
     * @param  string $originalValue 数据库中原始的 value 字段值 (始终是字符串)
     * @param  array  $data          当前模型的所有数据数组
     * @return mixed
     */
    public function getValueAttr(?string $originalValue, array $data)
    {
        // 检查 'type' 键是否存在于 $data 数组
        if (isset($data['type'])) {
            if (strtolower($data['type']) === 'switch') {
                return (bool) intval($originalValue);
            }
            if (strtolower($data['type']) === 'json' || strtolower($data['type']) === 'array') {
                return json_decode($originalValue, true);
            }
        }
        // 如果类型不是 'switch' 或没有特定处理，则返回原始值
        return $originalValue;
    }

    /**
     * 获取器：获取配置项的显示文本 (例如 "开启", "关闭")
     * 这会创建一个新的虚拟属性，例如 $model->value_text
     *
     * @param  mixed $value           此虚拟属性的原始值 (这里是 null，因为它不是数据库字段)
     * @param  array $data            当前模型的所有数据数组
     * @return string|null
     */
    public function getValueTextAttr($value, array $data): ?string
    {
        // 我们需要 $data['value'] (数据库中存储的实际值) 和 $data['options']
        if (isset($data['value']) && isset($data['options']) && !empty($data['options'])) {
            // $data['options'] 是一个 JSON 字符串，如 "{\"0\": \"关闭\", \"1\": \"开启\"}"
            $optionsArray = json_decode($data['options'], true);

            // 检查 JSON 是否成功解码且结果是一个数组
            if (json_last_error() === JSON_ERROR_NONE && is_array($optionsArray)) {
                // $data['value'] (例如 "0" 或 "1") 是 $optionsArray 中的键
                $currentStoredValueKey = $data['value'];

                if (array_key_exists($currentStoredValueKey, $optionsArray)) {
                    return $optionsArray[$currentStoredValueKey]; // 返回对应的显示文本，如 "关闭"
                }
            }
        }
        // 如果没有 options，或 JSON 无效，或 value 在 options 中找不到，则返回 null
        return null;
    }
}
